{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Numpy实现多项式曲线拟合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "问题定义：  \n",
    "对于一堆数据点(x, y)，能否只根据这些数据，找出一个函数，使得函数画出来的曲线和原始数据曲线尽量匹配？\n",
    "\n",
    "多项式拟合问题：   \n",
    "任何可微连续的函数，都可以用一个N次多项式来估计，而比N次幂更高阶的部分为无穷小可以忽略不计\n",
    "\n",
    "3次多项式即：a$x^3$ + b$x^2$ + cx + d  \n",
    "比如我们可以让sin(x) 约等于 a$x^3$ + b$x^2$ + cx + d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 构造原始数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# x是一个数组，在-5~5，等间距生成的50个点\n",
    "x = np.linspace(-5, 5, 50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 假造y，为sin(x)，同时加上一些噪声，模拟真实世界的数据\n",
    "y = np.sin(x) + np.random.rand(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((50,), (50,))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x2587ef64288>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 使用Numpy拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用三次方多项式做拟合\n",
    "params = np.polyfit(x, y, 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2.44631542e-06,  6.85554130e-06, -1.42869551e-04, -4.71558008e-04,\n",
       "        2.68256282e-03,  1.31688587e-02, -1.60617972e-02, -1.88551394e-01,\n",
       "       -1.30178467e-03,  9.68170269e-01,  5.95591664e-01])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "poly1d([ 2.44631542e-06,  6.85554130e-06, -1.42869551e-04, -4.71558008e-04,\n",
       "        2.68256282e-03,  1.31688587e-02, -1.60617972e-02, -1.88551394e-01,\n",
       "       -1.30178467e-03,  9.68170269e-01,  5.95591664e-01])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构造一个便捷多项式对象\n",
    "param_func = np.poly1d(params)\n",
    "param_func"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 根据原始的x，计算拟合的y_predict\n",
    "y_predict = param_func(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x258000d2b08>]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3hUVfrA8e9JD0kgQBIgISEhdEI19CIWBEQBu2LBinXd1RXF1VVXXcXu/lbXtooIYkdEQGw0pQeQFoqUVFpogfR2fn+QuJRJmZk7c2fmvp/n4TGZuTP3zW7mzbnnvuc9SmuNEEII3+dndgBCCCHcQxK+EEJYhCR8IYSwCEn4QghhEZLwhRDCIgLMDqA2UVFROjEx0ewwhBDCq6xdu/aQ1jra1nMem/ATExNJS0szOwwhhPAqSqnM2p6TKR0hhLAISfhCCGERkvCFEMIiJOELIYRFSMIXQgiLkIQvhBAW4bFlme4ye30uL32/nb3HiomNDGXSiI6M6xVndlhCCGE4Syf82etzeXTWJorLKwHIPVbMo7M2AUjSF0L4HEtP6bz0/fY/kn2N4vJKXvp+u0kRCSGE61g64e89VmzX40II4c0snfBjI0PtelwIIbyZpRP+pBEdCQ30P+2x0EB/Jo3oaFJEQgjhOpa+aVtzY1aqdIS3keoy4QhLJ3w4mfTlgyK8iVSXCUdZekpHCG8k1WXCUT43wpdLXeHrpLpMOMqnRvg1l7q5x4rR/O9Sd/b6XLNDE8IwUl0mHOVTCV8udYUVSHWZcJRPTenIpa6wgrqqy2RKU9TFpxJ+bGQouTaSu9mXuvIhFEazVV0m1TuiPj41pWPrUjckwM/US125ryDcRaY0RX18aoRfM4qZ9MUGyqs0ACUVVTw7byufp2XToUUEsZEh+CmFn1IoRfXX0Dg0kAs7tyAs2Nj/Ser6EMqoS9THnqtDmdIU9TEkuymlPgAuAQ5qrVNsPD8M+AbYU/3QLK3100ac+0zjesUxtmcs+/JL2HHgBL8fKGDHgRPsOFjAF2nZFJZV1vraiOAArjinNTcOaENydLgh8ciHUDjK3ikaT53SFJ7DqOHsh8AbwEd1HPOL1voSg85XJ6UUsZGhxEaGMqxjzB+Pa60pKK1AA7oKqrSmSms0sOdQITNWZvLxqkw+XJ7BkPZR3Ni/DRd0boG/n3I4FvkQCkfZe3U4aUTH0/5AgFTviNMZkvC11kuVUolGvJcrKaWICAm0+VxUeDB9Epvx+OgufLo6i49XZTFx+lpaNw3ljfG96Rkf6dA55UMoath7897eq0Op3hH1UVprY97oZMKfW8eUzldADrAXeEhrvcXGcROBiQAJCQnnZGZmGhKbIyoqq/hp6wH+OX8r+UXlzLyjPylxTQD7P7jyYRNnTs/AyT/8z1/erdbfhUFTFtq8OoyLDGXZ5PNdem7hvZRSa7XWqTafc1PCbwxUaa0LlFIXA//SWrev6/1SU1N1WlqaIbE5I+doEde8s5LCsgo+ndifbftOyIdH2M2R5G1UojbqD4fwDnUlfLeUZWqtj2utC6q/ng8EKqWi3HFuZ7Vu2oiZd/QjJMCf699bxXPzt0rpm7CbIzfvx/WK4/nLuxEXGYriZIKuL9lrrVmXdZRPVmexaPtBtu8/YTPZ13du4ZvcUpaplGoJHNBaa6VUX07+oTnsjnMboU3zMD6+ox/XvLOSgydKbR4jHx5RF0dv3je0fXdpRSVzN+xj2ooMNubkNzgmYS1GlWV+AgwDopRSOcCTQCCA1vpt4ErgbqVUBVAMXKuNmktyk+TocGbe0Y+Rry+lykbk8uERdXHVzfsDx0v4eGUmM1dncaigjOToMJ4Z25VzO8SQV1DC3mMl/Jh+gHmb9lF5yi9ugJ/igQvrnFUVPsiwOXyjGT2H78iNU1uvyT1azEs/nD59I3P4oiGMvHlfUVnFM3PT+XhVFpVac0GnGCYMTGRwuyiUOruMuObcuceKCQ30p7i8knYx4Uy5vBupic2c/dGEB3HLTVujGZnwHbn5Vddrso8U8eqPO9BAbJMQHh7ZSZK9cJuyiir+8tl65m/az/h+Cdw5tC1tmofZ9R6Lth/k8a83k3usmOv7JfDIqE40rqVkWXgX02/ams2RHiN1veZPF7Tn6bFdAZh8cWdJ9sJtSsoruXN6GvM37efx0Z157rJudid7gPM6xvDDA0O5bXASn6zOYvirS9ic27C5f+G9LJHwHamQqO814/u1oUfrJjz9bTr5xeXOBylEPQpLK7j1wzUs3pHHc5d14/YhbZ16v7DgAP5+SRe+vmcQAX5+3Dx1NRmHCg2KVngiSyR8R3YIqu81/n6Kf17WjSOFpbwsJZnCxY6XlHPTB6tZufswr17dg/H9Egx77x7xkXx0W1+qNNz0wWoOHi8x7L2FZ7FEwndkh6CGvCYlrgkTBiYyY1Umv2UfMzZoIaodKSxj/Hsr2ZhzjDfH9+ayXq0NP0dydDhTb+7DoYJSJkxdI1etPsoSCd+RBSwNfc2DwzsQExHMY19voqKyyrU/iLCcorIKxr+3kh0HCnj3xlRGdWvlsnP1iI/knRvPYefBE9zxURol5bV3lhXeyRJVOq723aZ93P3xOv5+SRduG5xkdjjChzw+exMzVmbx4S19Tuv86krfbtjL/Z+u58LOLXjr+t4E+FtiXOgzLF+l42ojU1pyXsdoXv1hO/vyZcWtMMaibQeZsTKL2wcnuS3ZA1zaI5anLu3Kj+kH+NvXm/DUQaGwnyR8AyileHpsChVVmqe/TTc7HOEDDheUMunLjXRqGcFDJrTSnjAwkfvPb8fnaTm8tWSX288vXEMSvkHimzXi/gva893m/SzcdsDscIQX01rz6KxNHC8u57VrehJyRvGAuzwwvAOju7fitR93sGWv1Oj7Akn4BrpjSFuSo8N4bv42qmw13BGWMHt9LoOmLCRp8jwGTVlo94b1X6Tl8EP6AR4a0YHOrRq7KMr6KaV4dmwKkY2CePCzDZRWyE1cbycJ30BBAX78+cIO7DxYwA/p+80OR5igpiVH7rFiNP/bh7ahST/rcBH/+HYL/ds24/bBzi2sMkLTsCBevKI72w+c4LUffzc7HOEkSfgGG92tFUlRYbyxaKfc7LIgR9p41Kis0jz4+W/4KcXLV/XAz4m9lI10XqcYrusbz7tLd5GWccTscIQTJOEbzN9Pcfe5yWzOPc6SHXlmhyPczJE2HjXeXrKLtMyjPD2uK62bNjI6NKc8NroLcU1D+esXGygsrTA7HOEgSfguMK5XHLFNQnhjoYzyrcaRNh4Aby3e+cdVwEsLtts97+9q4cEBvHxlD7KOFPH8d1vNDkc4SBK+CwQF+HHnucmkZR5l1R65BLYSR9p41PSqr7E3v8SueX936de2ObcPTmLGyiyWytWrV5KE7yLX9IknKjyYNxftNDsU4UaOtPF4dm76Wbuoeeo+yX+9qCPtY8J5+MuN5BdJvx1v45Y9ba0oJNCf24ckMeW7bWzIPkaP+EizQxJu0tB9aAGqqjSHCstsPueJ+ySHBPrz6tU9uew/y3h6bjqvXN3D7JCEHWSE70I39G9Dk9BA3pBRvqjF3E37an3OU/dJ7ta6CROHtuWrdTmszTxqdjjCDpLwXSg8OICbBybyY/oBtu0/bnY4wsOUVlTy0vfbiI0MISTg9I+iERucu8rs9bl8XX1/4dp3VzBrbY7JEYmGkoTvYrcMSiQsyJ83F0k/EnG66SsyyT5SzAtXdGfKFd3tmvc3S83Csn35JzdJKa/UPDJro8fdYBa2yRy+i0U2CuKG/m1475fdPDi8A0lR9u8/KnxPflE5/164kyHtoxjSPhrAIxP8mWwtLCuv1Lzw3TaH4q+pUNp7rJjYyFAmjejoFf87eCtJ+G5w25Akpi7P4K3FO3nxSrnJJeA/S3ZyvKScyaM6mR1KrUnX1uO13Uje58C2iDVXCzV/QGraUIB3/PHzRjKl4wYxESFckxrP7PV7yTtRanY4wmS5x4qZuiyDy3rF0TW2iamx1Nb75/HZm2w+HtkosNb32nHghF3ndqYNhXCMJHw3mTAwkbLKKj5bk2V2KMJkr/xwMqE9dJH5N2VrS7qfrMq2+bjWnLWwLCTAj0ZB/vzj2y12rSx3pg2FcIwkfDdpFxPOkPZRzFiZJXvfWlj63uN8vT6XWwcleUTZZW3JtbKWxJ1fXH7WwrIpV3Tn0VGdWLbzMAs2N7xLrKNtKITjZA7fjW7s34aJ09fyY/oBl25GLTzXvxf+TnhwAHcPSzY7FOBkcs21kfT9lbKZ9GMjQ20uLKus0sxcnc2z87YyrGMMoUH1b9oyaUTH0+bwwbPLUX2BjPDd6ILOLYiLDGXaigyzQxEm2JVXwIIt+7lpwMkFeZ6gtt4/1/WLt6snkL+f4qlLu5B7rJh3ljasBNmRNhTCOYaM8JVSHwCXAAe11ik2nlfAv4CLgSLgZq31OiPO7U38/RQ39G/DCwu2sX3/CTq2jDA7JOFG7yzZRZC/H7cMSjI7lD/UJFdbVTqpbZrZVTLZr21zLu0Ry9tLdnFNn3haNal/asaeNhTCecqI9r1KqaFAAfBRLQn/YuBPnEz4/YB/aa371fWeqampOi0tzenY3KkhNcVHCsvo//zPXJ3ammfHdTMpUuFu+/KLGfriIsb3TeAfY8/6iPiM7CNFXPDKEsb2jOWlq6QE2QxKqbVa61RbzxkypaO1XgrU1Qd4LCf/GGit9UogUinlU5PYDd3arllYEGN6xDJrXS7HS6TboFW8t3QPWsMdQ83fttCV4ps14uZBiXy5Loet+6SdiKdx1xx+HJB9yvc51Y+dRik1USmVppRKy8vzrn7b9tQUTxiQSFFZJV9JDxJLOFpYxiersxjTM9bjdrIyUs3m7e8u3Q3AA5/9ZnJE4kzuSvi2Nuc8ay5Ja/2u1jpVa50aHR3thrCMY09NcbfWTeiVEMn0FZlUndkIXficD5dnUFxeyV3nekZljiuceoULoDVs23+CF77bZnJk4lTuSvg5QPwp37cG9rrp3G5hb03xhAGJ7D5UyK87D7kyLGGywtIKPlyewfAuLejQwndv0tu6wgX47y+7mbU2h0FTFpI0eR6DpiyURmsmclfCnwPcpE7qD+RrrWtvBO6F7N3ablS3lkSFB/HRigzXBydM88nqLPKLy7nHQ+ruXaW2K9zyqpPdNOu7tyXcw5CEr5T6BFgBdFRK5SilblNK3aWUuqv6kPnAbmAn8B5wjxHn9ST21hQHB/hzXd8Eft52kOwjRe4NVrhFaUUl7/2ymwFtm9MroanZ4bhUXatjyytPn7aUfjnmMaQOX2t9XT3Pa+BeI87lyeytKR7fL4H/LN7FjFWZPDqqswsjE2aYvT6XA8dLedkC5Ym1rZq1Nc0D0i/HLLLS1kStmoQyomsLPluTTUktHwzhnSqrNG8v2U1KXGMGt4syOxyXq+0KN0765XgU6aVjshv6t2H+pv3M37SPy3u3/uNx2RjCuy3YvJ89hwr5z/W9ObnQ3PfVdoX7yFcbKa34X8NA6ZdjHhnhm2xA2+YkRYXxyer/tU1u6CIu4bne+2U3SVFhjOja0uxQTDWuVxwvXNGdsOpmajERwdIvx0SS8E00e30ug19YxJ5DhazJOMpbi3cCsjGEt1uXdZTfso9xy6BE/P2sMbqvy7hecSyedB5hQf70SoiUZG8iSfgmOXOhCsDLP+xg9vpc2RjCy01dlkFESABXnDJFZ3XREcHcPSyZ77ccYPWeurqwCFeShG8SW6P4yirNiwu2ycYQXmxffjHzN+3j2j7xhAXLLbJT3Ta4LS0bh/DPeemywtwkkvBNUusoPr/E7kVcwnNMX5GJ1pqbBiSaHYrHCQ3y56ERHdmQk8/cTT617tJrSMI3SW2j9SB/P9kYwksVl1XyyeoshndpQXwz322S5ozLesXRpVVjXvhum5Qim0CuOU1ia6FKgJ+irLKKHQdOyMYQXmj2b7kcLSrnVg/a4MTT+PspHhvdmev/u4ppyzO404cbynkiGeGbxNYo/qlLuxLk73daiabwDlprpi7bQ5dWjemb1MzscDzaoHZRnN8phjcW7eRIYZnZ4ViKjPBNZGsUvyrjCLPW5fLIyE6EBNa/EbTwDMt2HmbHgQJevqqHZRZaOePRUZ0Y8fpS/u/n33lqTFezw7EMGeF7mOv6xpNfXM58uanlVaYu20NUeBCX9vCpjdxcpn2LCK7tm8CMlZnsOVRodjiWIQnfw9haeSs8255Dhfy87SDj+7UhOECuyhrqLxe2JzjATzZJcSNJ+B5GKcV1feNZk3GUHQdOmB2OaIBpyzMI9Ffc0D/B7FC8SkxECHedm8yCLftZtfuw2eFYgiR8D3RF79Zy89ZLHC8p54u0bC7tHktMRIjZ4Xid24e0JS4ylCfnbKGisqr+FwinSML3QM3DgxmR0pJZ63KlVtnDfb4mm8KySm6RUkyHhAb58/jozmzbf4KPV8kAx9Uk4XsouXnr+SqrNB+tyCS1TVO6tW5idjhea2RKSwa3i+KVH7ZzqKDU7HB8miR8DzWgbXPaRoUxU0Y9Hmvx9oNkHSni5kGJZofi1ZRSPDWmC0Vllby0QDrCupIkfA918uZtAmmZR9m+X27eeqJpKzJp0TjY8j3vjdAuJoLbBifxWVo2v2UfMzscnyUJ34Ndcc7Jm7czV2WaHYo4w668ApbuyOP6fm0I9JePkRH+dEF7YiKCeeKbzdJN00XkN9WDNQsLYlS3lsxan0txmdy89STTV2QS5O/HdX2lFNMo4cEBPDa6Mxtz8vk8Lduu185en8ugKQtJmjyPQVMWyu5wtZCE7+HG903gREkF327ca3YoolpBaQVfrs1hdPdWREcEmx2OTxnTI5a+ic14YcE2jhU1rM+ObAnacJLwPVzfpGa0iwmXm7ceZNa6HApKK7hpQBuzQ/E5Sin+MbYr+cXlvPrjjga9RrYEbThJ+B5OKcX4vgn8ln2M9L3HzQ7H8rTWTFueQY/WTeiV0NTscHxS51aNuWlAIjNWZrI5N7/e42VL0IaThO8FrujdmuAAP2aulpu3Zlu28zC78gqZMDDR7FB82gPDO9AsLIjJszZSXs8KXNkStOEk4XuBJo0CGd29FbPX76WwtMLscCxt2ooMmocFMbq7dMV0pSahgTwzNoXNucd5d+nuOo+VLUEbThK+l7i+XwIFpRXM2SA3b82SfaSIn7ce4Lq+CdIV0w1GdWvF6O6teP2nHXWuRalrS1Cp3jmdbIDiJXonNKVjiwhmrsqSUkCTzFiZiVKK66Urpts8PaYrK3YdZtKXG5h190ACalnzYGszoZrqnZobujXVOzXHW5EhI3yl1Eil1Hal1E6l1GQbz9+slMpTSv1W/e92I85rJUopxvdLYFNuPpty6r+RJYxVXFbJp2uyGdG1Ba2ayNywuzQPD+aZsSlszMnn3V/qnto5k1TvnM3phK+U8gfeBEYBXYDrlFJdbBz6mda6Z/W//zp7Xisa1yuOkEC5eWuGORtyyS8uZ8KARLNDsZzR3VtxcbeWvP7j7/xuxx4RUr1zNiNG+H2BnVrr3VrrMuBTYKwB7yvO0CQ0kEu7x/LNb3s5UVJudjiWcbIUM5NOLSNkg3KTPD02hbBgfx76cmOD++ZL9c7ZjEj4ccCp66Bzqh870xVKqY1KqS+VUvG23kgpNVEplaaUSsvLyzMgNN9zff82FJVVWv7mkzut3nOE9H3HmTAwUTYoN0lUeDBPj01hQ/Yx3vtlT4NeI9U7ZzMi4dv6BJzZ+ehbIFFr3R34CZhm64201u9qrVO11qnR0dEGhOZ7erRuQkpcY6avzERraTDlDlOXZRDZKJBxPa15o89TXNK9FSO7tuS1H3c0aGqnruodqzKiSicHOHXE3ho4rXZQa33qhpXvAS8YcF5LUkoxYUAik77cyIpdhxnYLqrO42evz+Wl77ez91gxsZGhTBrR0dK/8PbKPlLED+n7ufPcZEKDpBTTTEopnhmXwsrXlvDA57/x1d0D6y2PtVW9Y2VGjPDXAO2VUklKqSDgWmDOqQcopU5dpTIG2GrAeS3r0h6xNG0UyIfLM+o8TppKOW96dSnmjf2lb44niI4I5sUrurM59zjPzZM0Yi+nE77WugK4D/iek4n8c631FqXU00qpMdWH3a+U2qKU2gDcD9zs7Hmtavb6XC54ZQlHi8r5If0AH/xa+3ymlKU5p6isgk9XZzEypaWlb/R5mou6tuS2wUlMW5HJvI2ObwFqxUVZhiy80lrPB+af8dgTp3z9KPCoEeeysjMXkgA8N38rzcKCbF62Slmac75al8vxkgpulS0MPc4jIzuxNvMoj3y1ka6xjUmMCrPr9VZdlCWtFbyIrRF7RZXmxQXbbB4vZWmOq6rSfLhsDz1aN6G3dMX0OEEBfrwxvhf+fop7Pl5HSbl9GwRZ9epXEr4XqXXEnl9i83EpS3Pc0t/z2JVXyC2DkqQU00O1btqIV67qQfq+4zw7L92u11r16lcSvhepbWQe6K9slmhKWZrjpi7LICYimIu7SVdMMzR0fv3CLi2YOLQtM1Zm8a0djQWtevUrzdO8yKQRHc+aww/0V5RXatIyj9In8exVoFKWZr+dBwtYsiOPB4d3IChAxkTuZu/8+qQRHVmbeZTJ1fP5baPD6z2Hrc+SFa5+5bfZi9gasT87LoXGIQH1lmiKhpu2PIMgfz/G95OumGawd3490N+Pf1/Xi8AAP+75eB1FZfXvGWHVq18Z4XsZWyP23w8UMHV5BvvzS2jZJMSkyHxDfnE5X63LYUzPWKLCZYNyMzgyvx4bGcq/ru3FLVNX89fPN/Dm+N74+dV978WKV78ywvcBNw1IpEprZq6SLprO+nxNNkVlldwipZimcXR+/dwO0Tw6qjPfbd7PvxfudEVoXk8Svg9IaN6I8zvGMHN1FqUV9pWnif+prNJMW5FB36RmdI1tYnY4luVMddntQ5K4vHccr/20gwWbHV+U5ask4fuICQMTOVRQxvxN8kvuqAWb95NztPishVZWXJFpJmfm15VSPHdZN3rGR/LAZxtI33vc9QF7EeWpHRdTU1N1Wlqa2WF4jaoqzYWvLaFRkD/f3jdYasdrUVszOa01Y95YRkFpBT89eC7+1fO/tlY3hwb6W+IGnzc7eLyES9/4lQA/P+bcN4jmFrofo5Raq7VOtfWcjPB9hJ+fYuKQtmzOPc6vOw+ZHY5HqquZ3PJdh9mUm8+dQ9v+kezBuisyvV1M4xDevTGVQwWl3P3xOsoqGrZpiq+ThO9DLusdR0xEMG8t3mV2KB6pruT91uJdxEQEc1nv00ftVl2R6Qt6xEfy4pXdWb3nCE/O2WJ2OB5BEr4PCQ7w5/YhSSzfdZgN2cfMDsfj1Jakc48V8+vOQ9w6OOms/upWXZHpK8b2jOPuYcl8sjqLGSulik0Svo+5rm8CjUMCeHuJjPLPVFuSDg30JyIkgOttLLSSfkTe76GLOnJex2iemrOF1XuOmB2OqSTh+5iIkEBuGpDIgi372ZVXYHY4HsVW8g4O8KOkopIb+rchIiTwrNdYdUWmL/H3U7x+bS8SmjXino/XWno6Tqp0fNChglIGTVnIuJ5xvHBld7PD8ShnVum0ad6ItMyj/PrIecREyCplT+fMlp07D55g3JvLSYoK44u7BhAS6JtbVkqVjsVEhQdzTZ94Zq3PYX8trZN9XW218+N6xbFs8vnsmTKar+8dSFrmUa48p7Ukey/g7Jad7WIieO2anmzKzedvszbZ7DDr6yTh+6g7hrSlSsP7v+42OxS3a2himLosg4rKKiYOaWtOoMIuRpTIDu/Sggcu7MCs9bl8sCzD4Ag9nyR8HxXfrBGXdm/FzFVZHCsqMzsct2pIYjhRUs6MlZmMSmll9/Z4whxGlcj+6fx2jOjagufmb2WZxdasSML3YXeem0xhWSXTV1irHK0hiWHmqixOlFRw17nJ7gpLOMmoElk/P8UrV/ckOTqMe2euI+dokRHheQVJ+D6sc6vGnNcxmqnLMygus05TtfoSQ2lFJe//uofB7aLo1trxJmnSY8e9jCyRDQ8O4N0bU6mo1Dz42QYqq6wxny8J38fdPawdRwrL+Dwt2+xQ3Ka+xPDl2hwOnih1anTv7A1EYT+jS2QTo8L4x5iurM44wjtLrbFuRTZA8XF9EptyTpumvLNkF9f0iffZUrRT1SQAW+V7JeWV/N/Pv3NOm6YMatfc4XPUdZ9AavRdx+hNSy7vHcfCbQd59YcdDG0fTUqcb7fFloTv45RSPHBhB254fxUzVmZyu49VpNRWl11bYvhoRQYHjpfyr2t7OdVRVHrs+AalFP+8LIW0zCP8+dP1zP3TEEKDfHdQJFM6FjC4fRRD2kfxxqKdHC8pNzscw9g7rXKipJz/LN7F0A7R9G/r+OgepMeOL4lsFMQrV/VkV14hU77banY4LiUJ3yIeGdmJY0XlvONDPXbsrct+75c9HCsq52ED+uBIjx3fMrh9FLcOSmLaikwWbT9odjguIwnfIlLimjCmRyzv/7qHA8d9Y/WtPdMqhwtKef+X3Yzu1sqQeVrpseN7Hh7ZkQ4twnn4y40cKfTNtSuS8C3koYs6Ulmlef2n380OxRD2TKv8Z/EuissreWB4B8POf2qbhmWTz5dk7+VCAv15/Zpe5BeVM/mrjT7ZesGQhK+UGqmU2q6U2qmUmmzj+WCl1GfVz69SSiUacV5hn4Tmjbi+Xxs+T8v2iU6aDZ1W2XusmOkrM7nynNa0iwl3Z4jCy3SJbcykER35If0AX63zvRJbpxO+UsofeBMYBXQBrlNKdTnjsNuAo1rrdsBrwAvOnlc45r7z2xES4MfLPrBFX0OnVf7v599Bw58vNG50L3zXbYOT6J0QyZTvtnHCh4ocwJiyzL7ATq31bgCl1KfAWCD9lGPGAk9Vf/0l8IZSSmlfvGbycFHhwUwcmsxrP+1gXdZReic0dfo9nWlZ66z66rJ35xXwxdocbhrQhjipoBEN4OenePLSrox9cxlvLtrF5FGdzA7JMEZM6cQBpy7jzKl+zOYxWusKIB84qy5OKTVRKZWmlErLy8szIDRhy+1DkogKD9ArCRAAABBOSURBVGLKd9ucnqf09BWnr/y4g+AAP+49r53ZoQgv0iM+kst7x/HBr3vIOuw7vXaMSPi2Vq+cmUUacgxa63e11qla69To6GgDQhO2hAUHcP8F7Vm95wiLtzv3h9WIlrWnMrI/zebcfOZt3Mftg5OICg92+H2ENT0yshP+forn5vtObb4RCT8HiD/l+9bA3tqOUUoFAE0Aa28uabJr+yTQpnkjXliwzanGUUauODXyakFrzTNz04lsFMjtQ31rdbFwjxaNQ7hnWDILtuxnxa7DZodjCCMS/hqgvVIqSSkVBFwLzDnjmDnAhOqvrwQWyvy9uYIC/HhkZCe27T/B1GV7TnvOnlG2kStOjbxa+CIth1V7jjB5ZCca29irVoiGuGNoW+IiQ3lmbrpPdNR0OuFXz8nfB3wPbAU+11pvUUo9rZQaU33Y+0BzpdRO4EHgrNJN4X6jUlpyYecYXv5hOxmHCgH7R9lGrjg16mrhUEEp/5y/lb6Jzbg6Nb7+FwhRi5BAfyaP6kT6vuN84QMdZw2pw9daz9dad9BaJ2ut/1n92BNa6znVX5dora/SWrfTWvetqegR5lJK8ey4bgT6+TF51kaqqrTdo2wjV5wadbXwzNx0issqee7yFPz8HG+QJgTAJd1bkdqmKS//sN3ryzRlpa3FtWwSwt9Gd2bl7iN8sibLoVG2UStOjbhaWLIjj29+28vdw5JpFxPhUBxCnEopxROXduFQQRlvLNppdjhOkYQvuLZPPAOTm/P8/G20aBxi8xh3dIF09mqhuKySx2dvom10GPecJ1sXCuN0bx1Jn8SmvLNkN4levMOZ9MMXKKWYcnl3Rry+lGZhQRwrKqOkouqP593ZBdKZDS5e/3kH2UeK+XRif4IDfLenuXC/2etz2ZST/8f3Nfe2AK/qoSQjfB/hbP16QvNGPDSiI+n7jnPlOa29rgtk+t7j/PeXPVyTGu90r3shzvTS99tPGwSBc+tNzCIjfB9QU1lTc7PV0dHHzQMTmbtxL/M27ePHB8/1msVKlVWaR7/eRNNGgTx6se8sgxeew5F7W2a2HKmNjPB9gFH16/5+ihev6E5haSVPzdliZIguNX1FBhuyj/H3S7oQ2SjI7HCED7K3gqy+8mYjV5TbQxK+DzBytWv7FhH86fx2zN24j1nrcpwNzeU2ZB/jue+2MaxjNGN6xJodjvBRtirI/P1Urfe26hqEmdl/ShK+DzB6f9W7hiXTv20zJn+1iTUZntsB4+DxEiZOTyMmIphXr+7p1KbkYN6oS3i+MyvIGlVvdD4g2fb9oroGYUb3n7KHJHwf4Ej9el3JLdDfj7dvOIe4pqHcOX2tR3YLLCmvZOL0tZwoqeC9m1JpFubcVI6nd/0U7lPbZ+PU9SYL/jwUgPeW2l5DWtcgzMgrcntJwvcB9tavNyS5RTYK4v0JqVRWaW6dtob8Ys9ZYai15rGvN/Nb9jFevbonnVs1dvo9zRx1Cc/R0D/8Cc0bMaZHLB+vyrK5/21dgzCjr8jtIQnfR9iz2rWhya1tdDhv3dCbjEOF3DdzHRWVp5elmeX9X/fw1bocHriwAyNTWhrynmaOuoTnsOcP/z3Dkikurzyr+SDUPQgzsv+UvaQs04LsSW4Dk6P452UpPPLVJp76dgvPjE1xeq7cGUt25PHc/K2MSmnJn843blOT2MhQcm38/O4YdQnPYc9no32LCEZ2bcmHyzO4Y2jbs7qy1raIsOYxM0o2JeFbkL3J7Zo+CezOK+SdpbtJjg7nlkFJrg7Rpt15Bdw3cx0dWkTw8lU9DG2MNmlEx9PWMoB7VxgLz2DvZ+Pe89qxYMt+pq/ItGtXNWdWlDtDpnQsyJFLykdGduKiLi14Zm463244c38b18s+UsRt09II9PfjvZtSCQs2dqxiZNdP4b3s/Wx0a92EcztE88Gveyguq7R5jCdRnroPSWpqqk5LSzM7DJ/lyCrAorIKbnp/NWmZR7n3vGQeHN4Rfze0H165+zB3z1hLlYYPbk7lnDbNXH5OYV32fjbWZBzhqrdX8MQlXbh1sDlXv6dSSq3VWqfafE4SvrBHaUUlT36zhU/XZHN+pxhev7an3TtK2fOBmrkqiye+2Uyb5o3474Q+JEWFGfFjCGGoq99ZQdbhIpY+fB5BAeZOnNSV8GVKR9glOMCf5y/vxjPjUli6I49xbyxj58GCBr++oWVv5ZVVPPnNZv729SYGtYvi63sHSbIXHuve89qx/3gJs3/z7HUbkvCF3ZRS3Ni/DTPv6M/xknLGvbmMn9IPNOi1DSl7O1ZUxs1TVzNtRSZ3DEnig5v7yL60wqMNbR9Fl1aNeXvJLqo8eO9bSfjCYX2TmjHnvsEkRYVx+0dpPPHNZnbl1T3ar6vsraS8kq/W5jD2zWWs2XOUl67szmOju7jlPoEQzlBKcdewZHbnFfLj1oYNfswgc/jCaSXllTw9N50v0rIpr9QMTG7ODf3bMLxLCwL9Tx9TDJqy0GbZW3hwAIH+iqNF5SRHh/HCFd1JTZSbs8J7VFRWcf4rS2gaFsTsewaatl5FbtoKt8g7UcrnadnMXJVF7rFiYiKCubZPPMO7tCTA/+Qv/6JtB/nXz79TesZmEn4KRnRtyY392zAgubmpi7uEcNSMlZk8Pnszn9zRv9bGaq4mCV+4VWWVZvH2g8xYmcniHXnU9Svmp2B4lxb8Y0wKLZvY3k9XCG9RUl7J4BcW0SW2MR/d2teUGOpK+LLSVhjO309xQecWXNC5BdlHitiy9397gZ6a/MOCAxiQ3PysaR8hvFVIoD+3DErkpe+3s2VvPl1jm5gd0mkk4YsGc2SxVnyzRsQ3a+SmCIUw3w392/DW4l28vWQ3/76ul9nhnEaGVqJBpF+8EA3TJDSQ6/snMG/jXjIPF5odzmkk4YsGkX7xQjTcbYOSCPDz471fbG+QYhZJ+KJBpF+8EA0X0ziEK86J4/O0HPJOlJodzh8k4YsGMXOXHiG80cShyZRXVtncIMUsTiV8pVQzpdSPSqnfq//btJbjKpVSv1X/m+PMOYU5zNylRwhvlBQVxqiUlkxfmcnhAs8Y5Ts7wp8M/Ky1bg/8XP29LcVa657V/8Y4eU5hAukXL4T9/nJhB0orqnj4y414wponpxZeKaW2A8O01vuUUq2AxVrrs4Z8SqkCrXW4Pe8tC6/EqRwpCRXCE0xdtod/fJvOM2O7cuOAxHqPn7NhLwOTmxMVHuzQ+VzZHrmF1nofQPV/Y2o5LkQplaaUWqmUGldHoBOrj0vLy8tzMjThK6QkVHizmwcmMqxjNM/O28qOAyfqPHbGykzu/2Q9by7a6ZJY6k34SqmflFKbbfwba8d5Eqr/4owHXldKJds6SGv9rtY6VWudGh0dbcfbC18mJaHCmymleOnKHkSEBHD/J+spKbe9FeL0FRk8Pnsz53eKYfKoTi6Jpd6Er7W+UGudYuPfN8CB6qkcqv97sJb32Fv9393AYsCzlp8Jl5i9PpdBUxaSNHkeg6YsdHhELiWhwttFRwTz0pU92Lb/BC8s2HbW8x+tyODv32zhws4xvHVDb4ID/M9+EwM4O6UzB5hQ/fUE4JszD1BKNVVKBVd/HQUMAtKdPK/wcEZOw0hJqPAF53WK4eaBiUxdlsGi7f8bG09bnsET1cn+zetdl+zB+YQ/BRiulPodGF79PUqpVKXUf6uP6QykKaU2AIuAKVprSfg+zshpGCkJFb5i8qhOdGoZwaQvNpB3opQPl+3hyTlbGN6lBf+5/hyXJntwsnma1vowcIGNx9OA26u/Xg50c+Y8wvsYOQ1TU40jVTrC24UE+vOva3tx6Ru/cvU7K9hzqJCLurTgjfG93bL5uXTLFC4RGxlqc2crR6dhxvWKkwQvfELHlhE8dnFnnpyzhRFdW/Dv69yT7EESvnCRSSM68uisTadN68g0jBAn3TSgDT3iI+ka29it+0FIwhcuIdMwQtROKUXP+Ei3n1cSvnAZmYYRwrNIt0whhLAISfhCCGERkvCFEMIiZA5fCCE8hKu7wkrCF0IID1DTjqSmlLmmHQlgWNKXKR0hhPAA7ugKKwlfCCE8gDu6wkrCF0IID+COrrCS8IUQwgO4oyus3LQVQggP4I52JJLwhRDCQ7i6HYlM6QghhEVIwhdCCIuQhC+EEBYhCV8IISxCEr4QQliEJHwhhLAISfhCCGERkvCFEMIiZOGVEEI4wdU97I0kCV8IIRzkjh72RpIpHSGEcJA7etgbSRK+EEI4yB097I0kCV8IIRzkjh72RnIq4SulrlJKbVFKVSmlUus4bqRSartSaqdSarIz5xRCCE/hjh72RnJ2hL8ZuBxYWtsBSil/4E1gFNAFuE4p1cXJ8wohhOnG9Yrj+cu7ERcZigLiIkN5/vJuHnnDFpys0tFabwVQStV1WF9gp9Z6d/WxnwJjgXRnzi2EEJ7A1T3sjeSOOfw4IPuU73OqHzuLUmqiUipNKZWWl5fnhtCEEMI66h3hK6V+AlraeOoxrfU3DTiHreG/tnWg1vpd4F2A1NRUm8cIIYRwTL0JX2t9oZPnyAHiT/m+NbDXyfcUQghhJ3dM6awB2iulkpRSQcC1wBw3nFcIIcQpnC3LvEwplQMMAOYppb6vfjxWKTUfQGtdAdwHfA9sBT7XWm9xLmwhhBD2crZK52vgaxuP7wUuPuX7+cB8Z84lhBDCOUprz7w3qpTKAzLNjsMBUcAhs4NwM/mZrcFqP7O3/rxttNbRtp7w2ITvrZRSaVrrWlcd+yL5ma3Baj+zL/680ktHCCEsQhK+EEJYhCR8471rdgAmkJ/ZGqz2M/vczytz+EIIYREywhdCCIuQhC+EEBYhCd+FlFIPKaW0UirK7FhcTSn1klJqm1Jqo1Lqa6VUpNkxuYLVNvNRSsUrpRYppbZWb3b0Z7NjchellL9Sar1Saq7ZsRhFEr6LKKXigeFAltmxuMmPQIrWujuwA3jU5HgMZ9HNfCqAv2qtOwP9gXst8DPX+DMn28H4DEn4rvMa8DC1tIL2NVrrH6r7JgGs5GRXVF/zx2Y+WusyoGYzH5+ltd6ntV5X/fUJTiZA79jtwwlKqdbAaOC/ZsdiJEn4LqCUGgPkaq03mB2LSW4FvjM7CBdo8GY+vkgplQj0AlaZG4lbvM7JAVuV2YEYyanmaVZW18YwwN+Ai9wbkes1ZDMcpdRjnJwG+NidsblJgzfz8TVKqXDgK+AvWuvjZsfjSkqpS4CDWuu1SqlhZsdjJEn4DqptYxilVDcgCdhQvddva2CdUqqv1nq/G0M0XH2b4SilJgCXABdo31zgYcnNfJRSgZxM9h9rrWeZHY8bDALGKKUuBkKAxkqpGVrrG0yOy2my8MrFlFIZQKrW2hu77jWYUmok8CpwrtbaJzckVkoFcPKG9AVALic39xnvy/s7qJOjlmnAEa31X8yOx92qR/gPaa0vMTsWI8gcvjDKG0AE8KNS6jel1NtmB2Q0i27mMwi4ETi/+v/X36pHvsILyQhfCCEsQkb4QghhEZLwhRDCIiThCyGERUjCF0IIi5CEL4QQFiEJXwghLEISvhBCWMT/A82Yoi2YBjPUAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.plot(x, y_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
